# 字符串格式化发射器
# 处理 IRSFormat 节点，生成 sformat 函数调用

from ...ir.expressions.string import IRSFormat
from ..core.emitter import EmitResult, NodeTypeEmitter
from ..core.context import CodeGenContext
from ..configs.operators import get_operator_precedence
from ..core.generator import get_global_generator


def generate_format_call_code(node: IRSFormat, context: CodeGenContext) -> str:

    generator = get_global_generator()

    # 生成参数列表
    args = []
    if node.is_format_str_literal:
        # 字面量格式字符串
        format_str = f'"{node.format_str}"'
    else:
        # 动态格式字符串表达式
        format_str = generator.generate_expression(
            node.format_str_expr, context, parent_precedence=100
        )

    args.append(format_str)

    # 处理命名参数
    for _, arg_value in node.named_args:
        arg_code = generator.generate_expression(
            arg_value, context, parent_precedence=100
        )
        args.append(f"({arg_code})")

    # 处理kwargs（如果有）
    if node.kwargs:
        kwargs_code = generator.generate_expression(
            node.kwargs, context, parent_precedence=100
        )
        args.append(f"**{kwargs_code}")

    # 生成函数调用
    args_str = ", ".join(args)
    return f"sformat({args_str})"


class StringFormatEmitter(NodeTypeEmitter):
    """字符串格式化发射器

    处理f-string和字符串格式化：
    - f"Hello {name}" -> sformat("Hello {}", name)
    - "Hello {}".format(name) -> sformat("Hello {}", name)
    """

    def __init__(self):
        super().__init__([IRSFormat])

    def emit(self, node: IRSFormat, context: CodeGenContext) -> EmitResult:
        """生成字符串格式化代码"""

        code = generate_format_call_code(node, context)
        precedence = get_operator_precedence("call")
        return EmitResult(code=code, precedence=precedence)

    def get_priority(self) -> int:
        """字符串格式化发射器的优先级"""
        return 60  # 中等优先级
